Sự khác biệt giữa truyền lên và truyền xuống đối với biến lớp

143
Dhivakar 2014-05-02 08:30.

Sự khác biệt giữa ép kiểu lên và ép xuống đối với biến lớp là gì?

Ví dụ trong chương trình sau lớp Animal chỉ chứa một phương thức nhưng lớp Dog chứa hai phương thức, thì làm thế nào chúng ta ép kiểu biến Dog thành biến Animal.

Nếu quá trình ép kiểu được thực hiện thì làm thế nào chúng ta có thể gọi phương thức khác của Dog với biến Animal.

class Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}


class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }

    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}

public class UseAnimlas 
{
    public static void main (String [] args) 
    {
        Dog d = new Dog();      
        Animal a = (Animal)d;
        d.callme();
        a.callme();
        ((Dog) a).callme2();
    }
}

10 answers

227
awksp 2014-05-02 09:12.

Dự báo lên đang truyền đến một loại siêu, trong khi dự báo xuống đang truyền tới một loại phụ. Dự báo lên luôn được cho phép, nhưng dự báo giảm liên quan đến kiểm tra loại và có thể ném một ClassCastException.

Trong trường hợp của bạn, một phép truyền từ a Dogđến an Animallà một phần tăng lên, bởi vì một Doglà-a Animal. Nói chung, bạn có thể upcast bất cứ khi nào có mối quan hệ giữa hai lớp.

Downcasting sẽ giống như sau:

Animal animal = new Dog();
Dog castedDog = (Dog) animal;

Về cơ bản những gì bạn đang làm là nói với trình biên dịch rằng bạn biết kiểu thời gian chạy của đối tượng thực sự là gì. Trình biên dịch sẽ cho phép chuyển đổi, nhưng vẫn sẽ chèn một kiểm tra thời gian chạy để đảm bảo rằng việc chuyển đổi có ý nghĩa. Trong trường hợp này, việc ép kiểu có thể xảy ra vì trong thời gian chạy animalthực sự là một Dogmặc dù kiểu tĩnh animalAnimal.

Tuy nhiên, nếu bạn phải làm điều này:

Animal animal = new Animal();
Dog notADog = (Dog) animal;

Bạn sẽ nhận được một ClassCastException. Lý do tại sao là vì animalkiểu thời gian chạy của nó là Animal, và vì vậy khi bạn yêu cầu thời gian chạy thực hiện ép kiểu, nó sẽ thấy rằng đó animalkhông thực sự là a Dogvà do đó ném a ClassCastException.

Để gọi phương thức của lớp cha bạn có thể thực hiện super.method()hoặc bằng cách thực hiện upcast.

Để gọi phương thức của lớp con, bạn phải thực hiện downcast. Như được hiển thị ở trên, bạn thường gặp rủi ro ClassCastExceptionkhi làm điều này; tuy nhiên, bạn có thể sử dụng instanceoftoán tử để kiểm tra kiểu thời gian chạy của đối tượng trước khi thực hiện ép kiểu, điều này cho phép bạn ngăn chặn ClassCastExceptions:

Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog) {
    // Guaranteed to succeed, barring classloader shenanigans
    Dog castedDog = (Dog) animal;
}
65
Premraj 2016-01-21 21:02.

Truyền xuống và truyền lên như sau:

Nâng cấp : Khi chúng tôi muốn chuyển một lớp Phụ thành lớp Siêu, chúng tôi sử dụng Upcasting (hoặc mở rộng). Nó diễn ra tự động, không cần phải làm bất cứ điều gì rõ ràng.

Downcasting : Khi chúng ta muốn truyền một Super class sang Sub class, chúng ta sử dụng Downcasting (hoặc thu hẹp) và Downcasting không thể thực hiện trực tiếp trong Java, rõ ràng chúng ta phải thực hiện.

Dog d = new Dog();
Animal a = (Animal) d; //Explicitly you have done upcasting. Actually no need, we can directly type cast like Animal a = d; compiler now treat Dog as Animal but still it is Dog even after upcasting
d.callme();
a.callme(); // It calls Dog's method even though we use Animal reference.
((Dog) a).callme2(); // Downcasting: Compiler does know Animal it is, In order to use Dog methods, we have to do typecast explicitly.
// Internally if it is not a Dog object it throws ClassCastException
33
Nagarjuna Yelisetty 2015-09-28 12:46.

Dự báo lên và dự báo xuống là một phần quan trọng của Java, cho phép chúng ta xây dựng các chương trình phức tạp bằng cách sử dụng cú pháp đơn giản và mang lại cho chúng ta những lợi thế lớn, như Đa hình hoặc nhóm các đối tượng khác nhau. Java cho phép một đối tượng của kiểu lớp con được coi như một đối tượng của bất kỳ kiểu lớp cha nào. Điều này được gọi là upcasting. Dự báo lên được thực hiện tự động, trong khi dự báo xuống phải được lập trình viên thực hiện theo cách thủ công và tôi sẽ cố gắng hết sức để giải thích tại sao lại như vậy.

Dự báo lên và dự báo xuống KHÔNG giống như truyền nguyên thủy từ cái này sang cái khác, và tôi tin rằng đó là nguyên nhân gây ra nhiều sự nhầm lẫn, khi lập trình viên bắt đầu học đúc đối tượng.

Tính đa hình: Tất cả các phương thức trong java đều là ảo theo mặc định. Điều đó có nghĩa là bất kỳ phương thức nào cũng có thể bị ghi đè khi được sử dụng trong kế thừa, trừ khi phương thức đó được khai báo là cuối cùng hoặc phương thức tĩnh .

Bạn có thể xem ví dụ bên dưới cách getType();hoạt động theo loại đối tượng (Chó, Thú cưng, Chó cảnh sát).

Giả sử bạn có ba con chó

  1. Con chó - Đây là lớp siêu cấp.

  2. Pet Dog - Chó cưng kéo dài tuổi chó.

  3. Chó Cảnh Sát - Police Dog mở rộng Pet Dog.

    public class Dog{ 
       public String getType () {
          System.out.println("NormalDog");
          return "NormalDog";
       }
     }
    
    /**
     * Pet Dog has an extra method dogName()
     */   
    public class PetDog extends Dog{ 
       public String getType () {
          System.out.println("PetDog");
          return "PetDog";
       }
       public String dogName () {
          System.out.println("I don't have Name !!");
          return "NO Name";
       }
     }
    
    /**
     * Police Dog has an extra method secretId()
     */
    public class PoliceDog extends PetDog{
    
     public String secretId() {
        System.out.println("ID");
        return "ID";
     }
    
     public String getType () {
         System.out.println("I am a Police Dog");
         return "Police Dog";
     }
    }
    

Tính đa hình: Tất cả các phương thức trong java đều là ảo theo mặc định. Điều đó có nghĩa là bất kỳ phương thức nào cũng có thể bị ghi đè khi được sử dụng trong kế thừa, trừ khi phương thức đó được khai báo là cuối cùng hoặc phương thức tĩnh. (Giải thích thuộc về Khái niệm bảng ảo)

Virtual Table / Dispatch Table: Bảng điều phối của một đối tượng sẽ chứa địa chỉ của các phương thức liên kết động của đối tượng. Các cuộc gọi phương thức được thực hiện bằng cách tìm nạp địa chỉ của phương thức từ bảng điều phối của đối tượng. Bảng điều phối giống nhau cho tất cả các đối tượng thuộc cùng một lớp và do đó thường được chia sẻ giữa chúng.

public static void main (String[] args) {
      /**
       * Creating the different objects with super class Reference
       */
     Dog obj1 = new Dog();
`         /**
           *  Object of Pet Dog is created with Dog Reference since                
           *  Upcasting is done automatically for us we don't have to worry about it 
           *  
           */
     Dog obj2 = new PetDog();
`         /**
           *  Object of Police Dog is created with Dog Reference since                
           *  Upcasting is done automatically for us we don't have to worry       
           *  about it here even though we are extending PoliceDog with PetDog 
           *  since PetDog is extending Dog Java automatically upcast for us 
           */
      Dog obj3 = new PoliceDog();
}



 obj1.getType();

Bản in Normal Dog

  obj2.getType();

Bản in Pet Dog

 obj3.getType();

Bản in Police Dog

Việc hạ cấp cần được lập trình viên thực hiện thủ công

Khi bạn cố gắng gọi secretID();phương thức trên obj3đó PoliceDog objectnhưng được tham chiếu đến Doglà một siêu lớp trong hệ thống phân cấp, nó sẽ phát ra lỗi vì obj3không có quyền truy cập vào secretId()phương thức. Để gọi phương thức đó, bạn cần Downcast obj3 đó theo cách thủ công PoliceDog

  ( (PoliceDog)obj3).secretID();

cái nào in ID

Theo cách tương tự để gọi dogName();phương pháp trong PetDoglớp học mà bạn cần phải nhìn xuống obj2để PetDogtừ obj2 được tham chiếu tới Dogvà không được tiếp cận với dogName();phương pháp

  ( (PetDog)obj2).dogName();

Tại sao lại như vậy, dự báo lên là tự động, nhưng dự báo giảm phải là thủ công? Bạn thấy đấy, dự báo không bao giờ có thể thất bại. Nhưng nếu bạn có một nhóm các Chó khác nhau và muốn downCast tất cả chúng vào một chủng loại, sau đó có một cơ hội, mà một số trong những Chó thực sự của các loại khác nhau tức là, PetDog, PoliceDog, và quá trình thất bại, bởi ném ClassCastException.

Đây là lý do bạn cần phải downcast các đối tượng của mình theo cách thủ công nếu bạn đã tham chiếu các đối tượng của mình tới loại siêu lớp.

Lưu ý: Ở đây bằng cách tham chiếu có nghĩa là bạn không thay đổi địa chỉ bộ nhớ của các loại bỏ khi bạn downcast nó vẫn như cũ, bạn chỉ nhóm chúng thành loại cụ thể trong trường hợp này Dog

12
Nadeesha Thilakarathne 2015-11-10 19:30.

Tôi biết câu hỏi này đã được hỏi cách đây khá lâu nhưng đối với những người mới sử dụng câu hỏi này. Vui lòng đọc bài viết này có mô tả đầy đủ về dự báo lên, dự báo xuống và sử dụng toán tử instanceof

  • Không cần phải upcast theo cách thủ công, nó tự diễn ra:

    Mammal m = (Mammal)new Cat(); tương đương với Mammal m = new Cat();

  • Nhưng dự báo xuống luôn phải được thực hiện thủ công:

    Cat c1 = new Cat();      
    Animal a = c1;      //automatic upcasting to Animal
    Cat c2 = (Cat) a;    //manual downcasting back to a Cat
    

Tại sao lại như vậy, dự báo lên là tự động, nhưng dự báo giảm phải là thủ công? Bạn thấy đấy, dự báo không bao giờ có thể thất bại. Nhưng nếu bạn có một nhóm Động vật khác nhau và muốn từ chối tất cả chúng cho Mèo, thì có khả năng một số Động vật này thực sự là Chó và quá trình không thành công, bằng cách ném ClassCastException. Đây là nơi nên giới thiệu một tính năng hữu ích được gọi là "instanceof" , tính năng này kiểm tra xem một đối tượng có phải là phiên bản của Class nào đó hay không.

 Cat c1 = new Cat();         
    Animal a = c1;       //upcasting to Animal
    if(a instanceof Cat){ // testing if the Animal is a Cat
        System.out.println("It's a Cat! Now i can safely downcast it to a Cat, without a fear of failure.");        
        Cat c2 = (Cat)a;
    }

Để biết thêm thông tin vui lòng đọc bài viết này

6
UWAIS 2014-09-20 03:40.

Tốt hơn hãy thử phương pháp này để dự báo, rất dễ hiểu:

/* upcasting problem */
class Animal
{ 
    public void callme()
    {
        System.out.println("In callme of Animal");
    }
}

class Dog extends Animal 
{ 
    public void callme()
    {
        System.out.println("In callme of Dog");
    }

    public void callme2()
    {
        System.out.println("In callme2 of Dog");
    }
}

public class Useanimlas 
{
    public static void main (String [] args) 
    {
        Animal animal = new Animal ();
        Dog dog = new Dog();
        Animal ref;
        ref = animal;
        ref.callme();
        ref = dog;
        ref.callme();
    }
}
6
Alexis 2016-08-30 00:08.

Có lẽ bảng này sẽ giúp ích. Gọi callme()phương thức của lớp Parenthoặc lớp Child. Theo nguyên tắc:

UPCASTING -> Ẩn

TẢI XUỐNG -> Tiết lộ

4
Lemmy_Caution 2018-10-07 09:02.

1.- Dự báo.

Khi thực hiện upcasting, bạn xác định một thẻ thuộc loại nào đó, nó trỏ đến một đối tượng của kiểu con (Kiểu và kiểu con có thể được gọi là lớp và lớp con, nếu bạn cảm thấy thoải mái hơn ...).

Animal animalCat = new Cat();

Điều đó có nghĩa là thẻ đó, animalCat, sẽ chỉ có chức năng (các phương thức) của loại Động vật, bởi vì chúng tôi đã khai báo nó là loại Động vật, không phải là loại Mèo.

Chúng tôi được phép làm điều đó theo cách "tự nhiên / ngầm định / tự động", tại thời điểm biên dịch hoặc tại thời điểm chạy, chủ yếu là vì Cat kế thừa một số chức năng của nó từ Animal; ví dụ, move (). (Ít nhất, mèo là một con vật, phải không?)

2.- Hạ cấp.

Nhưng, điều gì sẽ xảy ra nếu chúng ta cần lấy chức năng của Cat, từ loại thẻ Animal của chúng ta ?.

Khi chúng ta đã tạo thẻ AnimalCat trỏ đến một đối tượng Cat, chúng ta cần một cách để gọi các phương thức của đối tượng Cat, từ thẻ animalCat của chúng ta theo một cách khá thông minh.

Thủ tục như vậy được chúng tôi gọi là Downcasting và chúng tôi chỉ có thể thực hiện nó vào lúc chạy.

Thời gian cho một số mã:

public class Animal {
    public String move() {
        return "Going to somewhere";
    }
}

public class Cat extends Animal{
    public String makeNoise() {
        return "Meow!";
    }   
}

public class Test {

    public static void main(String[] args) {
        
    //1.- Upcasting 
    //  __Type_____tag________object
        Animal animalCat = new Cat();
    //Some animal movement
        System.out.println(animalCat.move());
        //prints "Going to somewhere"
        
    //2.- Downcasting   
    //Now you wanna make some Animal noise.
        //First of all: type Animal hasn't any makeNoise() functionality.
        //But Cat can do it!. I wanna be an Animal Cat now!!
        
        //___________________Downcast__tag_____ Cat's method
        String animalNoise = ( (Cat) animalCat ).makeNoise();
        
        System.out.println(animalNoise);
        //Prints "Meow!", as cats usually done.
        
    //3.- An Animal may be a Cat, but a Dog or a Rhinoceros too.
        //All of them have their own noises and own functionalities.
        //Uncomment below and read the error in the console:
        
    //  __Type_____tag________object
        //Cat catAnimal = new Animal();
        
    }

}
2
amit shah 2015-08-07 20:40.

Parent: Car
Con: Figo
Car c1 = new Figo ();

=====
Nâng cấp: -
Phương thức: Đối tượng c1 sẽ tham chiếu đến Phương thức của Lớp (Figo - Phương thức phải được ghi đè) vì lớp "Figo" được chỉ định bằng "mới".
Biến thể hiện: Đối tượng c1 sẽ tham chiếu đến biến thể hiện của Lớp khai báo ("Xe").

Khi lớp Khai báo là cha và đối tượng được tạo là con thì quá trình truyền ngầm diễn ra là "Upcasting".

======
Hạ xuống: -
Figo f1 = (Figo) c1; //
Phương thức: Đối tượng f1 sẽ tham chiếu đến Phương thức của Lớp (figo) vì đối tượng ban đầu c1 được tạo với lớp "Figo". nhưng khi quá trình ép kiểu xuống được thực hiện, các phương thức chỉ có trong lớp "Figo" cũng có thể được tham chiếu bởi biến f1.
Biến thể hiện: Đối tượng f1 sẽ không tham chiếu đến biến thể hiện của lớp Khai báo của đối tượng c1 (lớp khai báo cho c1 là CAR) nhưng với việc ép kiểu xuống, nó sẽ tham chiếu đến các biến thể hiện của lớp Figo.

======
Sử dụng: Khi Đối tượng thuộc Lớp con và lớp khai báo là Lớp cha và Lớp con muốn truy cập biến Cá thể của lớp riêng của nó chứ không phải của lớp cha thì có thể thực hiện bằng "Downcasting".

1
David 2014-05-02 09:26.

upcasting có nghĩa là truyền đối tượng tới một siêu kiểu, trong khi downcasting có nghĩa là truyền đến một kiểu con.

Trong java, upcasting là không cần thiết vì nó được thực hiện tự động. Và nó thường được gọi là đúc ngầm. Bạn có thể chỉ định nó để làm rõ cho người khác.

Do đó, viết

Animal a = (Animal)d;

hoặc là

Animal a = d;

dẫn đến chính xác cùng một điểm và trong cả hai trường hợp sẽ được thực hiện callme()từ Dog.

Thay vào đó, việc hạ cấp là cần thiết vì bạn đã xác định alà đối tượng của Động vật. Hiện tại bạn biết đó là một Dog, nhưng java không đảm bảo điều đó. Trên thực tế trong thời gian chạy, nó có thể khác và java sẽ ném một ClassCastException, điều đó có xảy ra không. Tất nhiên đó không phải là trường hợp ví dụ mẫu của bạn. Nếu bạn không truyền ađến Animal, java thậm chí không thể biên dịch ứng dụng vì Animalkhông có phương thức callme2().

Trong ví dụ của bạn, bạn không thể truy cập mã callme()của Animalfrom UseAnimlas(vì Dogghi đè nó) trừ khi phương thức sẽ như sau:

class Dog extends Animal 
{ 
    public void callme()
    {
        super.callme();
        System.out.println("In callme of Dog");
    }
    ... 
} 
0
Rakesh 2016-02-22 21:09.

Chúng ta có thể tạo đối tượng để Downcasting. Trong loại hình này cũng có. : gọi các phương thức của lớp cơ sở

Animal a=new Dog();
a.callme();
((Dog)a).callme2();

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Làm thế nào để xây dựng một quả địa cầu từ Scratch

Làm thế nào để xây dựng một quả địa cầu từ Scratch

Thời gian, sự kiên nhẫn, thời gian, sự cống hiến và thời gian chỉ là một vài trong số những thứ mà Peter Bellerby cần để thành lập và sau đó điều hành Bellerby & Co. Globemakers, một trong những công ty duy nhất trên Trái đất vẫn sản xuất các quả địa cầu bằng tay.

Năm giai đoạn đau buồn sau khi mất việc làm

Năm giai đoạn đau buồn sau khi mất việc làm

Đó là một ngày thứ Bảy, máy bay của tôi hạ cánh, và tôi đã sẵn sàng để thư giãn trong một kỳ nghỉ cuối tuần ngắn ngủi, khi một email đến trên điện thoại của tôi. Tôi đã mất việc.

Giữ an toàn cho danh tính của bạn với một cảnh báo đóng băng hoặc gian lận tín dụng

Giữ an toàn cho danh tính của bạn với một cảnh báo đóng băng hoặc gian lận tín dụng

Nếu bạn đã từng bị đánh cắp danh tính của mình, bạn biết đó là một trải nghiệm đáng sợ và căng thẳng. Một cách không phổ biến để ngăn chặn nó? Tín dụng bị đóng băng.

Buổi ra mắt phần 3 của The Good Place có một học sinh mới: Khán giả

Buổi ra mắt phần 3 của The Good Place có một học sinh mới: Khán giả

Eleanor (Kristen Bell) dường như đã tình nguyện cho chúng tôi làm vật tưởng nhớ. NBC's The Good Place là một chương trình thích thử thách tốt.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language